#ifndef CANPROTMANAGER_H
#define CANPROTMANAGER_H


#include <QString>
#include <QMap>
#include <QVector>

// 信号值描述映射
using SignalValueDesc = QMap<quint64, QString>;

// CAN信号结构
struct CanSignal
{
    QString signalName;          // 信号名称
    QString signalDescription;   // 信号描述
    QString byteOrder;           // 字节顺序(Motorola/Intel)
    int startByte;               // 起始字节
    int startBit;                // 起始位
    QString signalSendType;      // 信号发送类型
    int bitLength;               // 信号长度(bit)
    QString dataType;            // 数据类型
    double resolution;           // 精度
    double offset;               // 偏移量
    double minPhys;              // 物理最小值
    double maxPhys;              // 物理最大值
    quint64 minHex;              // 总线最小值
    quint64 maxHex;              // 总线最大值
    quint64 initialValue;        // 初始值
    QString unit;                // 单位
    SignalValueDesc valueDescs;  // 信号值描述
};

// CAN报文结构
struct CanMessage
{
    QString msgName;             // 报文名称
    QString msgType;             // 报文类型
    quint32 msgId;               // 报文ID
    QString msgSendType;         // 发送类型
    int msgCycleTime;            // 周期时间(ms)
    int msgLength;               // 报文长度(Byte)
    QVector<CanSignal> signalsL;  // 包含的信号列表
};

// CAN配置管理器
class RecvCANProtManager {
public:
    bool loadConfig(const QString& filePath);  // 加载JSON配置
    const CanMessage* findMessage(quint32 msgId) const;  // 根据ID查找报文
    bool parseSignal(const CanSignal& signal, const QByteArray& data,
                    double& physValue, QString& valueDesc) const;  // 解析信号

private:
    QMap<quint32, CanMessage> m_msgMap;  // 报文ID到报文的映射

    // 解析字节序(Motorola/Intel)
    quint64 extractRawValue(const CanSignal& signal, const QByteArray& data) const;
};

#endif // CANPROTMANAGER_H
